﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Objects;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using Terminal.Models;

namespace Modelo
{
    public class Consultas
    {
        private TrabajoFinalDbContext db;


        public Consultas(TrabajoFinalDbContext db)
        {
            this.db = db;
        }


        /// <summary>
        /// Consulta que retorna una coleccion de nombres de empresa junto a la cantidad de ToquesDeDarsena que tuvo entre dos fechas.
        /// </summary>
        /// <param name="fechaInicial"></param>
        /// <param name="fechaFinal"></param>
        /// <returns></returns>
        public List<EmpresaConCantidadDeToques> ToquesEntreFechas(DateTime fechaInicial, DateTime fechaFinal)
        {
            var toques = db.ToqueDeDarsenas
                .Where<ToqueDeDarsena>
                (
                    t =>
                        (EntityFunctions.TruncateTime(t.FechaHoraCarga) >= EntityFunctions.TruncateTime(fechaInicial))
                    &&  (EntityFunctions.TruncateTime(t.FechaHoraCarga) <= EntityFunctions.TruncateTime(fechaFinal))
               )
               .GroupBy(t => t.Empresa.Nombre)
               .Select(group => new EmpresaConCantidadDeToques { Nombre = group.Key, CantidadToques = group.Count() })
               .OrderBy(line => line.Nombre);
            return toques.ToList();
        }


        /// <summary>
        /// Consulta que retorna una colección de ToquesDeDarsena que una Empresa tuvo entre dos fechas.
        /// </summary>
        /// <param name="fechaInicial"></param>
        /// <param name="fechaFinal"></param>
        /// <param name="empresa"></param>
        /// <returns></returns>
        public List<ToqueDeDarsena> ToquesEntreFechasParaEmpresa(DateTime fechaInicial, DateTime fechaFinal, Empresa empresa)
        {
            var toques = db.ToqueDeDarsenas
                .Where<ToqueDeDarsena>(
                    t =>
                        (EntityFunctions.TruncateTime(t.FechaHoraCarga) >= EntityFunctions.TruncateTime(fechaInicial))
                    && (EntityFunctions.TruncateTime(t.FechaHoraCarga) <= EntityFunctions.TruncateTime(fechaFinal))
                    && (t.Empresa.Id == empresa.Id));
            return toques.ToList();
        }


        /// <summary>
        /// Consulta que retorna una colección de ToquesDeDarsena que una Empresa tuvo para una Localidad entre dos fechas.
        /// </summary>
        /// <param name="fechaInicial"></param>
        /// <param name="fechaFinal"></param>
        /// <param name="idEmpresa"></param>
        /// <param name="idLocalidad"></param>
        /// <returns></returns>
        public List<ToqueDeDarsena> ToquesEntreFechasPorEmpresaYLocalidad(DateTime fechaInicial, DateTime fechaFinal, int idEmpresa, int idLocalidad)
        {
            var toques = db.ToqueDeDarsenas
                .Where<ToqueDeDarsena>
                (
                    t =>
                       (EntityFunctions.TruncateTime(t.FechaHoraCarga) >= EntityFunctions.TruncateTime(fechaInicial))
                    && (EntityFunctions.TruncateTime(t.FechaHoraCarga) <= EntityFunctions.TruncateTime(fechaFinal))
                    && (t.Empresa.Id == idEmpresa)
                    && (t.Localidad.Id == idLocalidad));
            return toques.ToList();
        }


        public Empresa EmpresaPorCodigo(int codigoEmpresa)
        {
            var resultado = db.Empresas.Where<Empresa>(e => e.Codigo == codigoEmpresa);
            if (resultado.Any())
            {
                return resultado.First();
            }
            return null;
        }


        public Localidad LocalidadPorCodigo(int codigoLocalidad)
        {
            var resultado = db.Localidades.Where<Localidad>(l => l.Codigo == codigoLocalidad);
            if (resultado.Any())
            {
                return resultado.First();
            }
            return null;
        }
    }
}